﻿#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <initializer_list>
using namespace std;
struct Point
{
	int _x;
	int _y;
};
void Test1()
{
	//c++11扩大了用大括号括起的列表(初始化列表)的使用范围，使其可用于所有的内置类型和用户自
	//定义的类型，使用初始化列表时，可添加等号(= )，也可不添加。
	int x1 = 1;
	int x2{ 2 };
	int array1[]{ 1, 2, 3, 4, 5 };
	int array2[5]{ 0 };
	Point p{ 1, 2 };
	vector<int> v1 = { 1,2,3,4 };
	vector<int> v2{ 1,2,3,4 };
	list<int> ls1 = { 1,2,3,4 };
	list<int> ls2{ 1,2,3,4 };
	map<string, int>m1 = { {"string",1},{"vector",2} };
	map<string, int>m2{ { "string",1 },{ "vector",2 } };

	// C++11中列表初始化也可以适用于new表达式中
	int* pa = new int[4]{ 0 };

	//那么容器是如何支持这种花括号里面放列表初始化的呢？
	//实际上是采用了一个新的容器叫做template<class T> class initializer_list;这个容器是一个模板
	//我们假设是vector<int> il{ 1,2,3,4 };这个例子 看一下过程
	//首先创建一个initializer_list对象(使用auto和initializer_list<int>的效果是一样的
	//因为auto生成的也是initializer_list类型的)
	//auto il1 = { 1,2,3,4 };
	//initializer_list<int> il2 = { 1,2,3,4 };
	//
	//实际上花括号里面的数据实际上是给了一个initializer_list<T>的容器
	//让后开好vector的大小然后遍历initializer_list<T>里面的数据然后一一插入
	//这里会调用vector的构造函数因为c++11支持了initializer_list<T>为参数的构造函数
	//其余的容器像list，map等也都是类型的
	//vector(initializer_list<T> l)
	//{
	//	_start = new T[l.size()];
	//	_finish = _start + l.size();
	//	_endofstorage = _start + l.size();
	//	iterator vit = _start;
	//	typename initializer_list<T>::iterator lit = l.begin();
	//	while (lit != l.end())
	//	{
	//		*vit++ = *lit++;
	//	}
	//	
	//	//for (auto e : l)
	//	//   *vit++ = e;
	//}

}



//template<class T1, class T2>
//void F(T1 t1, T2 t2)
//{
//	decltype(t1 * t2) ret;
//	cout << typeid(ret).name() << endl;
//}
//void Test2()
//{
//	//关键字decltype将变量的类型声明为表达式指定的类型。根据对象来推类型让后根据类型创建对象
//	// decltype的一些使用使用场景
//
//
//	const int x = 1;
//	double y = 2.2;
//	decltype(x * y) ret; // ret的类型是double
//	decltype(&x) p; // p的类型是int*
//	cout << typeid(ret).name() << endl;
//	cout << typeid(p).name() << endl;
//	F(1, 'a');
//}

//int main()
//{
//	return 0;
//}